//
//  StrongOrCopyViewController.m
//  DebugDemo
//
//  Created by XFB on 2018/11/8.
//  Copyright © 2018年 ZhouCheng. All rights reserved.
//

#import "StrongOrCopyViewController.h"

@interface StrongOrCopyViewController ()

@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copysString;
@property (weak, nonatomic) IBOutlet UILabel *strongStringLabel;
@property (weak, nonatomic) IBOutlet UILabel *copyyStringLabel;
@property (weak, nonatomic) IBOutlet UILabel *stringLabel;

@property (nonatomic, strong) NSString *mSctrongString;
@property (nonatomic, copy) NSString *mCopysString;
@property (weak, nonatomic) IBOutlet UILabel *mutbleStrongStringLabel;
@property (weak, nonatomic) IBOutlet UILabel *mutableCopyyStringLabel;
@property (weak, nonatomic) IBOutlet UILabel *mutableStringLabel;

/// 总结
@property (weak, nonatomic) IBOutlet UILabel *conclusionLabel;
/// 总结标签的高度约束，其实设置这个也是UIScrollView的contentSize
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *conclusionConstantH;

@end

@implementation StrongOrCopyViewController

- (void)viewDidLayoutSubviews
{
    self.view.backgroundColor = [UIColor whiteColor];
    self.navigationItem.title = self.titleString;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self setupUI];
}

- (void)setupUI
{
    /// 测试不可变字符串
    [self test1];
    /// 测试可变字符串
    [self test2];
    
    /**
     总结:
     1.copy 重新开辟了一块内存空间存放
     2.strong 没有开辟一块新的内存空间，直接指向了之前的内存地址
     so
     用copy修饰NSString， 如果在无意中被一个NSMutableString类型的变量赋值
     原先的NSString会被copy 一份用来存储NSMutablString的值
     如果NSMutableString的值被修改，不会影响到NSString的值，这能体现到NSString作为不可变类型的性质
     
     用strong修饰的NSString， 如果在无意中被一个NSMutableString类型的变量赋值
     NSString不会被拷贝，一旦NSMutableString的值被修改，NSString的值也就发生的改变，这和NSString作为不可变类型相违背
     
     如果只是NSString被一个NSString赋值，copy和strong的效果是一样的
     */
    
    NSString *conclusionString = @"1.copy 重新开辟了一块内存空间存放 \n2.strong 没有开辟一块新的内存空间，直接指向了之前的内存地址 \n3.用copy修饰NSString，如果在无意中被一个NSMutableString类型的变量赋值,原先的NSString会被copy，一份用来存储NSMutablString的值，如果NSMutableString的值被修改，不会影响到NSString的值，这能体现到NSString作为不可变类型的性质 \n4.用strong修饰的NSString， 如果在无意中被一个NSMutableString类型的变量赋值，NSString不会被拷贝，一旦NSMutableString的值被修改，NSString的值也就发生的改变，这和NSString作为不可变类型相违背 \n5.如果只是NSString被一个NSString赋值，copy和strong的效果是一样的";
    CGSize conclusionSize = [conclusionString sizeWithContentFont:[UIFont systemFontOfSize:14] limitWidth:ScreenW-30];
    self.conclusionConstantH.constant = conclusionSize.height;
    self.conclusionLabel.text = conclusionString;
    
    /**
     scrollView的约束问题
     子控件添加到UIScrollView上
     1.如果是水平滚动，子控件设置垂直居中，需设置子控件的宽度
     2.如果是竖直滚动，子控件设置水平居中，需设置子控件的高度
     3.如果是水平和竖直方向都滚动，则不需要设置垂直和水平居中，但需要设置子控件的宽度和高度
     4.最后设置子控件上下左右的约束为0
     */
}

- (void)test1
{
    NSString *string = @"勒布朗·詹姆斯";
    self.strongString = string;
    self.copysString = string;
    string = @"勒布朗·詹姆斯";

    NSLog(@"%p---%p---%p", self.strongString, self.copysString, string);
    NSLog(@"%@---%@---%@", self.strongString, self.copysString, string);
    
    self.strongStringLabel.text = [NSString stringWithFormat:@"strongString---%@---%p", self.strongString, self.strongString];
    self.copyyStringLabel.text = [NSString stringWithFormat:@"copysString---%@---%p", self.copysString, self.copysString];
    self.stringLabel.text = [NSString stringWithFormat:@"string---%@---%p", string, string];
}

- (void)test2
{
    NSMutableString *mutableString = [NSMutableString stringWithFormat:@"勒布朗·詹姆斯"];
    self.mSctrongString = mutableString;
    self.mCopysString = mutableString;

    NSLog(@"%p---%p---%p", self.mSctrongString, self.mCopysString, mutableString);
    NSLog(@"%@---%@---%@", self.mSctrongString, self.mCopysString, mutableString);
    
    [mutableString appendString:@"0001"];
    
    NSLog(@"%p---%p---%p", self.mSctrongString, self.mCopysString, mutableString);
    NSLog(@"%@---%@---%@", self.mSctrongString, self.mCopysString, mutableString);

    self.mutbleStrongStringLabel.text = [NSString stringWithFormat:@"mS---%@---%p", self.mSctrongString, self.mSctrongString];
    self.mutableCopyyStringLabel.text = [NSString stringWithFormat:@"mC---%@---%p", self.mCopysString, self.mCopysString];
    self.mutableStringLabel.text = [NSString stringWithFormat:@"m---%@---%p", mutableString, mutableString];
}

@end
